/******************************************************************************中
 * @brief: mb task
 * @Author: aple
 * @Date: 2022-12-14 12:37:50
 * @LastEditors: aple
 * @LastEditTime: 2022-12-14 12:41:45
 * @Verision: 1.0.0.0
 ******************************************************************************/
#include "framework.h"
#include "eth_task.h"
#include "modbus/modbus_client.h"

/*****************************************************************************
 * @brief   const
 *****************************************************************************/

/*****************************************************************************
 * @brief   function
 *****************************************************************************/
static error_t client_init(void);
static void client_deinit(void);
static void mb_client_handle(void);

/*****************************************************************************
 * @brief   Global var
 *****************************************************************************/
ModbusClientContext mb_client_context;

/*****************************************************************************
 * @brief   loacal var
 *****************************************************************************/

/*****************************************************************************
 * @brief   task var
 *****************************************************************************/

/*******************************************************************************
 * @brief: TcpApp config default
 ******************************************************************************/
void mb_client_app_task(void const* argument);
osThreadDef(mb_client_app_task, osPriorityNormal, 1, 0x400);
static osThreadId_t task_id;

/*******************************************************************************
 * @brief: var
 ******************************************************************************/

/*******************************************************************************
 * @brief: mb TcpApp init
 * @param void
 * @return {*}
 ******************************************************************************/
void mb_client_app_task(void const* argument)
{
	osDelay(500);

	// init
	while (client_init() != NO_ERROR)
	{
		osDelay(100);
	}

	// connect ok
	while (1)
	{
		osDelay(100);
		mb_client_handle();
	}
}

/*******************************************************************************
 * @brief: mb TcpApp init
 * @param void
 * @return {*}
 ******************************************************************************/
void mb_client_init(void)
{
	task_id = osThreadCreate(osThread(mb_client_app_task), NULL);
}


void mb_client_deinit(void)
{
	client_deinit();
	osThreadTerminate(task_id);
}

/*******************************************************************************
 * @brief: client link
 * @param void
 * @return {*}
 ******************************************************************************/
static error_t client_init(void)
{
	error_t error;
	IpAddr ip;

	do
	{
		error = modbusClientInit(&mb_client_context);

		if (error != NO_ERROR)
			break;

		error = modbusClientSetTimeout(&mb_client_context,
									   MODBUS_CLIENT_DEFAULT_TIMEOUT);

		if (error != NO_ERROR)
			break;

		error = modbusClientSetUnitId(&mb_client_context, 3);

		if (error != NO_ERROR)
			break;

		error = modbusClientBindToInterface(&mb_client_context, &netInterface[0]);

		if (error != NO_ERROR)
			break;

		ip.length = 4;
		ip.addr[0] = 192;
		ip.addr[1] = 168;
		ip.addr[2] = 1;
		ip.addr[3] = 5;
		error = modbusClientConnect(&mb_client_context, &ip, MODBUS_TCP_PORT);
	}
	while (0);

	return error;
}

static void client_deinit(void)
{
	modbusClientDisconnect(&mb_client_context);
	modbusClientClose(&mb_client_context);
	modbusClientDeinit(&mb_client_context);
}

/*******************************************************************************
 * @brief: mb TcpApp deinit
 * @param void
 * @return {*}
 ******************************************************************************/
void mb_client_handle(void)
{
	static int cnt = 0;
	uint16_t buff[16];
	size_t resp_len;

	// 每0.8s发一包数据，无响应请求
	if ((cnt & 7) == 0)
	{
		modbusClientWriteMultipleRegs(&mb_client_context, 10, 5, buff);

		if (mb_client_context.responseAduLen)
		{
		}
	}

	cnt++;
}
